home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacFormat España 20
/
macformat_20.iso
/
mac
/
Shareware
/
Desarrolladores
/
Sprite Animation Toolkit 2.3.8
/
Demos
/
HeartQuest demo ƒ
/
ClutFade
/
fade2.c
< prev
next >
Wrap
Text File
|
1995-12-13
|
5KB
|
194 lines
/*
Based on a demo by N. Jonas Englund.
Substantially improved and altered by Ingemar Ragnemalm 1994
- Better function naming, Mac-standard
- Simplified (removed unnecessary checks)
- Pascal library and interface
- Fade to anything, not just black
- Checks color table size
- Checks for CQD
- Works with both Think and MetroWerks.
*/
//================================= INCLUDES ====================================
#include "fade.h"
//================================= FUNCTIONS ===================================
static void CopyCluts (GDHandle);
static void CalcFade (short, FadeValues*, RGBColor fadeTo);
static void FadeOut (short, FadeValues, RGBColor fadeTo);
static void FadeIn (short, FadeValues, RGBColor fadeTo);
static void BlackOut (RGBColor fadeTo);
static void RestoreClut(void);
//================================== GLOBALS ====================================
CTabHandle gFade, // 'clut' to alter with fading functions
gOrig; // 'clut' to hold a copy of original
Handle gTempH; // temporary handle to copy 'clut'
short gCtSize;
short gCtSeedSave; // Must save and restore the seed!
/********************************** fade_screen *********************************/
extern
pascal void FadeScreen(short speed, Boolean fadeOut, RGBColor fadeTo)
{
GDHandle oldDev, hGD;
FadeValues rgbs;
SysEnvRec world;
if (noErr != SysEnvirons(1, &world)) return;
if (!world.hasColorQD) return;
gTempH = nil;
oldDev = GetGDevice();
hGD = GetMainDevice();
gCtSize = (*(*(*hGD)->gdPMap)->pmTable)->ctSize; /* Yet another case where Pascal is a lot simpler.*/
if (gCtSize < 1) return; // Can't run if no CLUT!
if (gCtSize > kMaxByte) return; // We don't expect that big CLUTs!
if ((*(*hGD)->gdPMap)->pixelSize > 8) return; // ctSize isn't 100% reliable! Check pixel size too!
SetGDevice(hGD);
CopyCluts(hGD);
CalcFade(speed, &rgbs, fadeTo);
if (fadeOut)
FadeOut(speed, rgbs, fadeTo);
else
FadeIn(speed, rgbs, fadeTo);
RestoreClut();
// TEST - make sure we restore properly
if (!fadeOut) SetEntries(0, gCtSize, (*gOrig)->ctTable);
SetGDevice(oldDev);
if (gTempH != nil) DisposeHandle(gTempH);
}
/*** fade_screen ***/
/*
Rutiner in:
FadeIn
FadeInAll
FadeInMain
FadeOut
FadeOutAll
FadeOutMain
*/
/********************************** CopyCluts **********************************/
static
void CopyCluts(GDHandle hGD)
{
gFade = (*(*hGD)->gdPMap)->pmTable;
gTempH = (Handle) (*(*hGD)->gdPMap)->pmTable;
HandToHand(&gTempH);
gOrig = (CTabHandle) gTempH;
HLock((Handle) gFade);
HLock((Handle) gOrig);
}
/*********************************** CalcFade **********************************/
static
void CalcFade(short speed, FadeValues *rgbs, RGBColor fadeTo)
{
short i;
for (i = 0; i <= gCtSize; i++)
{
rgbs->reds[i] = ((long)(*gFade)->ctTable[i].rgb.red - (long)fadeTo.red) / speed;
rgbs->greens[i] = ((long)(*gFade)->ctTable[i].rgb.green - (long)fadeTo.green) / speed;
rgbs->blues[i] = ((long)(*gFade)->ctTable[i].rgb.blue - (long)fadeTo.blue) / speed;
}
}
/*********************************** FadeOut ***********************************/
static
void FadeOut(short speed, FadeValues rgbs, RGBColor fadeTo)
{
short i, j;
gCtSeedSave = (*gFade)->ctSeed; // Save!
for (j = speed; j > 0; j--)
{
for (i = 0; i <= gCtSize; i++)
{
(*gFade)->ctTable[i].rgb.red -= rgbs.reds[i];
(*gFade)->ctTable[i].rgb.green -= rgbs.greens[i];
(*gFade)->ctTable[i].rgb.blue -= rgbs.blues[i];
}
SetEntries(0, gCtSize, (*gFade)->ctTable);
}
BlackOut(fadeTo);
}
/************************************ FadeIn ***********************************/
static
void FadeIn(short speed, FadeValues rgbs, RGBColor fadeTo)
{
short i, j;
BlackOut(fadeTo);
for (j = 0; j < speed; j++)
{
for (i = 0; i <= gCtSize; i++)
{
(*gFade)->ctTable[i].rgb.red += rgbs.reds[i];
(*gFade)->ctTable[i].rgb.green += rgbs.greens[i];
(*gFade)->ctTable[i].rgb.blue += rgbs.blues[i];
}
SetEntries(0, gCtSize, (*gFade)->ctTable);
}
(*gFade)->ctSeed = gCtSeedSave; // Restore!
}
/*********************************** BlackOut **********************************/
static
void BlackOut(RGBColor fadeTo)
{
short i;
for (i = 0; i <= gCtSize; i++)
{
(*gFade)->ctTable[i].rgb.red = fadeTo.red;
(*gFade)->ctTable[i].rgb.green = fadeTo.green;
(*gFade)->ctTable[i].rgb.blue = fadeTo.blue;
}
SetEntries(0, gCtSize, (*gFade)->ctTable);
}
/********************************** RestoreClut ********************************/
static
void RestoreClut(void)
{
short i;
for (i = 0; i <= gCtSize; i++)
{
(*gFade)->ctTable[i].rgb.red = (*gOrig)->ctTable[i].rgb.red;
(*gFade)->ctTable[i].rgb.green = (*gOrig)->ctTable[i].rgb.green;
(*gFade)->ctTable[i].rgb.blue = (*gOrig)->ctTable[i].rgb.blue;
}
(*gFade)->ctSeed = GetCTSeed();
MakeITable(nil, nil, 0);
HUnlock((Handle) gFade);
HUnlock((Handle) gOrig);
}